package com.guang.executor.threadpoolmonitor;

import com.guang.interupt.ThreadInteruptOne;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Objects;
import java.util.concurrent.*;

/**
 * @author lg
 * @Description 线程池监控：1、监控线程；2、监控任务
 * @date 2022/11/1 15:25
 */
public class ThreadPoolMonitor extends ThreadPoolExecutor {
    private static Logger logger = LoggerFactory.getLogger(ThreadPoolMonitor.class);
    /**
     * 默认访问父类构造
     * @param corePoolSize 核心线程数量
     * @param maximumPoolSize 最大线程数量
     * @param keepAliveTime 非核心线程存活时间
     * @param unit 非核心线程存活时间单位
     * @param workQueue 任务存放队列
     * @param threadFactory 生产线程工厂
     * @param handler 拒绝策略
     */
    public ThreadPoolMonitor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    /**
     * 监控线程池中的线程
     */
    public void monitorThread(){
        logger.info("当前线程池中的活跃线程数有：{}",getActiveCount());
        logger.info("当前线程池中的线程数量有：{}",getPoolSize());
        logger.info("当前线程池中的最大线程数量有：{}",getLargestPoolSize());
    }

    public void monitorTaskCount(){
        logger.info("当前已经提交的任务数量有：{}",getTaskCount());
        logger.info("当前完成的任务数量有：{}",getCompletedTaskCount());
        logger.info("获取得到当前的任务队列大小：{}",getQueue().size());
    }

    /**
     * 线程完成之前的操作
     * @param t 线程
     * @param r 任务
     */
    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        logger.info("当前执行线程的名称是：{}",t.getName());
        monitorThread();
    }

    /**
     * 线程执行完任务之后
     * @param r 任务对象
     * @param t 异常对象
     */
    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        logger.info("当前线程执行的线程任务是：{}",r.toString());
        logger.info("当前线程执行期间存在异常，对应的异常信息是：{}", t.toString());
    }
}
